﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez;
using BussinessLogicTecnoPez.Produccion.Producto;
using BussinessLogicTecnoPez.Produccion.FaenamientoEnvasado;
using BussinessLogicTecnoPez.Produccion.Clasificacion_e_Incubacion;
using Tecnopez.Globals;
using System.Transactions;
using System.Text;
using WebUtils.Controls;
using BussinessLogicTecnoPez.Produccion.Enfermedades_y_control_de_estanques;

public partial class Modules_FaenamientoEnvasado_PlanFaenamientoEnvasado : System.Web.UI.Page, IPostBackEventHandler
{
    #region Session y ViewState
    private bool VIEW_STATE_TEMPLATE
    {
        get { return Convert.ToBoolean(ViewState["view_state_isTemplate"]); }
        set { ViewState["view_state_isTemplate"] = value; }
    }    

    private DetallePlanFaenamientoEnvasado DetallePlan
    {
        get { return Session["detallePlanFaenamiento"] as DetallePlanFaenamientoEnvasado; }
        set { Session["detallePlanFaenamiento"] = value; }
    }
    private List<ProductoEsperado> ProductosPlan
    {
        get
        {
            List<ProductosFaenamiento> objList = Session["productosPlanFaenamiento"] as List<ProductosFaenamiento>;
            List<ProductoEsperado> objNewList = new List<ProductoEsperado>();
            if (objList == null)
                return null;
            foreach (ProductosFaenamiento objProd in objList)
            {
                objNewList.Add(new ProductoEsperado(objProd));
            }
            return objNewList;
        }
        set
        {
            List<ProductosFaenamiento> objNewList = new List<ProductosFaenamiento>();
            if (value == null)
            {
                Session["productosPlanFaenamiento"] = null;
                return;
            }
            foreach (ProductoEsperado objProd in value)
            {
                objNewList.Add(new ProductosFaenamiento(objProd.Producto, objProd.CantidadEsperada, 0));
            }
            Session["productosPlanFaenamiento"] = objNewList;
        }
    }
    private List<AsignacionTemplate> AsignacionesTemplate
    {
        get { return Session["AsignacionesTemplate"] as List<AsignacionTemplate>; }
        set { Session["AsignacionesTemplate"] = value; }
    }
    private void LimpiarSession()
    {
        Session.Remove("AsignacionesTemplate");
        Session.Remove("detallePlanFaenamiento");
        Session.Remove("estanquePlanFaenamiento");
        Session.Remove("productosPlanFaenamiento");
    }
    private bool ViewState_IsUpdate
    {
        get { return Convert.ToBoolean(ViewState["IsUpdate"]); }
        set { ViewState["IsUpdate"] = value; }
    }
    private int ViewState_TemplateCode
    {
        get { return Convert.ToInt32(ViewState["TemplateCode"]); }
        set { ViewState["TemplateCode"] = value; }
    }
    private Estanque EstanqueSeleccionado
    {
        get { return Session["estanquePlanFaenamiento"] as Estanque; }
        set { Session["estanquePlanFaenamiento"] = value; }
    }
    #endregion

    protected void Page_Load(object sender, EventArgs e)
    {
        _lblError.Text = "";
        //txtEstanque.Enabled = false;

        if (IsPostBack == false)
        {
            SetMode(PageMode.ListMode);
        }
        else
        {
            CreateFromTemplate();
        }

        InicializarGrilla();
        InicializarGrillaAsignacionesTemplate();
        InicializarGrillaDetalle();
        InicializarGrillaProductos();

        TPPPlanFaenamiento.ObjType = typeof(PlanDeFaenamientoEnvasado);
        TPPPlanFaenamiento.personalizarGestorAntesDelGetAll(PersonalizarPopUpTemplate);
        TPPTareaTemplate.ObjType = typeof(Tarea);
        TPPBuscarEstanque.ObjType = typeof(Estanque);

        cmdEliminarTemplate.OnClientClick = "return confirm('Esta seguro de eliminar este template?');";
        cmdAgregar.OnClientClick = "window.open('Asignacion.aspx?mode=new','Asignacion','left=250,top=100,width=600,height=375,status=no,resizable=yes,scrollbars=no'); return false;";
        cmdAgregarProducto.OnClientClick = "window.open('ProductoEsperado.aspx','Producto Esperado','left=250,top=100,width=600,height=375,status=no,resizable=yes,scrollbars=no'); return false;";
        cmdBuscarEstanque.OnClientClick = "window.open('BuscarEstanqueFaenamiento.aspx','Estanque','left=250,top=100,width=600,height=375,status=no,resizable=yes,scrollbars=no'); return false;";

        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/tar.png";
        master.Titulo = "Gestión de Planes de Faenamiento y Envasado";

        WriteJS();
    }
    private void WriteJS()
    {
        string strScript = "function LoadAsignaciones(){";
        strScript += this.ClientScript.GetPostBackEventReference(this, "Asignaciones");
        strScript += ";}";

        strScript += "function LoadEstanque(id){";
        strScript += "document.getElementById('" + this.txtEstanque.ClientID + "').value=id;";
        strScript += this.ClientScript.GetPostBackEventReference(this, "LoadEstanque");
        strScript += ";}";

        strScript += "function LoadProductoEsperado(){";
        strScript += this.ClientScript.GetPostBackEventReference(this, "LoadProductoEsperado");
        strScript += ";}";

        this.ClientScript.RegisterClientScriptBlock(this.GetType(), "Asignacion", strScript, true);
    }
    
    private void PersonalizarPopUpTemplate(object Manager)
    {
        EntityBase<PlanDeFaenamientoEnvasado>.getManager.AddFilter("IsTemplate", GenericManager<PlanDeFaenamientoEnvasado>.filterOperator.Equals, true);
    } 

    #region Grilla Principal
    private void InicializarGrilla()
    {
        grdPlanes.setupGrid(typeof(PlanDeFaenamientoEnvasado), cargarGrilla, true, true, this.ViewState);
    }    
    protected void grdPlanes_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (grdPlanes.Rows[0].Cells[0].Text == "&nbsp;")
        {
            return;
        }

        if (e.CommandName == "ver")
        {
            int IdPlan = int.Parse(grdPlanes.DataKeys[System.Convert.ToInt32(e.CommandArgument)].Value.ToString());
            PlanDeFaenamientoEnvasado.getManager.ClearFilters();
            PlanDeFaenamientoEnvasado.getManager.AddFilter("IdPlanFaenamientoEnvasado", GenericManager<PlanDeFaenamientoEnvasado>.filterOperator.Equals, IdPlan);
            PlanDeFaenamientoEnvasado objPlan = PlanDeFaenamientoEnvasado.getManager.GetOne();

            this.VIEW_STATE_TEMPLATE = objPlan.IsTemplate;
            if (objPlan.IsTemplate)
            {
                txtCodigoTemplate.Text = objPlan.IdPlanFaenamientoEnvasado.ToString();
                txtObservacionesTemplate.Text = objPlan.Observaciones;

                AsignacionTemplate objAsignacion = null;
                List<AsignacionTemplate> objList = new List<AsignacionTemplate>();
                foreach (ItemDetallePlanFaenamientoEnvasado objItem in objPlan.DetallePlanFaenamientoEnvasado)
                {
                    objAsignacion = new AsignacionTemplate(objItem);
                    objList.Add(objAsignacion);
                }
                this.AsignacionesTemplate = objList;
                InicializarGrillaAsignacionesTemplate();
            }
            else
            {
                txtCodigo.Text = objPlan.IdPlanFaenamientoEnvasado.ToString();
                txtObservaciones.Text = objPlan.Observaciones;
                //TPPEstanque.ItemSelected = objPlan.Estanque;
                txtEstanque.Text = objPlan.Estanque.ToString();
                this.EstanqueSeleccionado = objPlan.Estanque;
                TPCFechaInicio.Text = objPlan.FechaInicio.ToString();
                txtHoraDesde.Text = objPlan.FechaInicio.Value.ToShortTimeString();
                lblFechaHasta.Text = objPlan.FechaFin.ToString();
                lblHoraFin.Text = objPlan.FechaFin.Value.ToShortTimeString();
                TPPPlanFaenamiento.ItemSelected = null;

                this.DetallePlan = objPlan.DetallePlanFaenamientoEnvasado;
                InicializarGrillaDetalle();

                List<ProductoEsperado> objList = new List<ProductoEsperado>();
                foreach (ProductosFaenamiento objProducto in objPlan.ProductosPlanFaenamientoEnvasado.ItemList)
                {
                    objList.Add(new ProductoEsperado(objProducto));
                }
                this.ProductosPlan = objList;
                InicializarGrillaProductos();
                if ((PlanDeFaenamientoEnvasado.EstadosPlan)System.Enum.Parse(typeof(PlanDeFaenamientoEnvasado.EstadosPlan), objPlan.Estado.ToString()) != PlanDeFaenamientoEnvasado.EstadosPlan.Creado)
                {
                    cmdEditar.OnClientClick = "alert('Solo pueden editarse planes de faenamiento y envasado que se encuentran en estado Creado'); return false;";
                    cmdEliminar.OnClientClick = "alert('Solo pueden eliminarse planes de faenamineto y envasado que se encuentran en estado Creado'); return false;";
                }
                else
                {
                    cmdEditar.OnClientClick = "";
                    cmdEliminar.OnClientClick = "return confirm('Esta seguro de eliminar el registro?');";
                }
            }
            _lblErrorTemplate.Text = "";
            _lblError.Text = "";

            SetMode(PageMode.ViewMode);
        }
    }
    private void cargarGrilla()
    {
        PlanDeFaenamientoEnvasado.getManager.ClearFilters();
        PlanDeFaenamientoEnvasado.getManager.ClearOrders();
        PlanDeFaenamientoEnvasado.getManager.AddFilter("IdPlanFaenamientoEnvasado", GenericManager<PlanDeFaenamientoEnvasado>.filterOperator.Like, "%" + txtBuscarCodigo.Text.Trim() + "%");

        if (TPPBuscarEstanque.ItemSelected != null)
        {
            Estanque objEstanque = TPPBuscarEstanque.ItemSelected as Estanque;
            PlanDeFaenamientoEnvasado.getManager.AddFilter("Estanque", GenericManager<PlanDeFaenamientoEnvasado>.filterOperator.Equals, objEstanque.idEstanque);
        }

        if (ViewState[grdPlanes.PageDataViewOrderKey] == null)
            PlanDeFaenamientoEnvasado.getManager.AddOrder("IdPlanFaenamientoEnvasado", GenericManager<PlanDeFaenamientoEnvasado>.Order.orderDirection.DESC);
        else
            PlanDeFaenamientoEnvasado.getManager.AddOrder(ViewState[grdPlanes.PageDataViewOrderKey].ToString(), (GenericManager<PlanDeFaenamientoEnvasado>.Order.orderDirection)ViewState[grdPlanes.PageDataViewOrdenDireccionKey]);

        List<PlanDeFaenamientoEnvasado> lista = new List<PlanDeFaenamientoEnvasado>();
        lista = PlanDeFaenamientoEnvasado.getManager.GetFilter();
        grdPlanes.DataSource = lista;
        grdPlanes.DataBind();
    }
    #endregion

    #region Modos
    private PageMode getMode()
    {
        if (ViewState["PageMode"] == null)
            return PageMode.ModeNotFound;
        return (PageMode)ViewState["PageMode"];
    }
    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        switch (mode)
        {
            case PageMode.ListMode:
                mvABM.ActiveViewIndex = 0;
                break;
            case PageMode.NewMode:
                if (VIEW_STATE_TEMPLATE)
                {
                    mvABM.ActiveViewIndex = 2;
                    txtCodigoTemplate.ReadOnly = true;
                    txtObservaciones.ReadOnly = false;
                    grdAsigancionesTemplate.Enabled = true;
                    TPPTareaTemplate.Enable = true;
                    cmdAceptarTemplate.Visible = true;
                    cmdCancelarTemplate.Enabled = true;
                    cmdEditarTemplate.Enabled = false;
                    cmdEliminarTemplate.Enabled = false;
                }
                else
                {
                    mvABM.ActiveViewIndex = 1;
                    txtCodigo.ReadOnly = true;
                    //TPPEstanque.Enable = true;
                    txtEstanque.ReadOnly = true;
                    TPCFechaInicio.Enabled = true;
                    txtHoraDesde.Enabled = true;
                    txtObservaciones.ReadOnly = false;
                    TPPPlanFaenamiento.Enable = true;
                    grdAsignaciones.Enabled = true;
                    grdProductos.Enabled = true;
                    cmdAceptar.Visible = true;
                    cmdCancelar.Enabled = true;
                    cmdEditar.Enabled = false;
                    cmdEliminar.Enabled = false;
                    cmdImprimir.Visible = false;
                    cmdAgregar.Enabled = true;
                    cmdAgregarProducto.Enabled = true;
                    cmdBuscarEstanque.Enabled = true;
                }

                break;
            case PageMode.EditMode:
                if (this.VIEW_STATE_TEMPLATE)
                {
                    mvABM.ActiveViewIndex = 2;
                    txtCodigoTemplate.ReadOnly = true;
                    txtObservaciones.ReadOnly = false;
                    grdAsigancionesTemplate.Enabled = true;
                    TPPTareaTemplate.Enable = true;
                    cmdAceptarTemplate.Visible = true;
                    cmdCancelarTemplate.Enabled = true;
                    cmdEditarTemplate.Enabled = false;
                    cmdEliminarTemplate.Enabled = false;
                }
                else
                {
                    mvABM.ActiveViewIndex = 1;
                    txtCodigo.ReadOnly = true;
                    //TPPEstanque.Enable = true;
                    txtEstanque.ReadOnly = true;
                    TPCFechaInicio.Enabled = true;
                    txtHoraDesde.Enabled = true;
                    txtObservaciones.ReadOnly = false;
                    TPPPlanFaenamiento.Enable = true;
                    grdAsignaciones.Enabled = true;
                    grdProductos.Enabled = true;
                    cmdAceptar.Visible = true;
                    cmdCancelar.Enabled = true;
                    cmdEditar.Enabled = false;
                    cmdEliminar.Enabled = false;
                    cmdImprimir.Visible = false;
                    cmdAgregar.Enabled = true;
                    cmdAgregarProducto.Enabled = true;
                    cmdBuscarEstanque.Enabled = true;
                }
                break;
            case PageMode.ViewMode:
                if (this.VIEW_STATE_TEMPLATE)
                {
                    mvABM.ActiveViewIndex = 2;
                    txtCodigoTemplate.ReadOnly = true;
                    txtObservaciones.ReadOnly = true;
                    grdAsigancionesTemplate.Enabled = false;
                    TPPTareaTemplate.Enable = false;
                    cmdAceptarTemplate.Visible = false;
                    cmdCancelarTemplate.Enabled = true;
                    cmdEditarTemplate.Enabled = true;
                    cmdEliminarTemplate.Enabled = true;
                }
                else
                {
                    mvABM.ActiveViewIndex = 1;
                    txtCodigo.ReadOnly = true;
                   // TPPEstanque.Enable = false;
                    txtEstanque.ReadOnly = true;
                    TPCFechaInicio.Enabled = false;
                    txtHoraDesde.Enabled = false;
                    txtObservaciones.ReadOnly = true;
                    TPPPlanFaenamiento.Enable = false;
                    grdAsignaciones.Enabled = false;
                    grdProductos.Enabled = false;
                    cmdAceptar.Visible = false;
                    cmdCancelar.Enabled = true;
                    cmdEditar.Enabled = true;
                    cmdEliminar.Enabled = true;
                    cmdImprimir.Visible = true;
                    cmdAgregar.Enabled = false;
                    cmdAgregarProducto.Enabled = false;
                    cmdBuscarEstanque.Enabled = false;
                }
                break;
        }

    }
    #endregion

    #region Plan de Faenamiento y Envasado
    private void CreateFromTemplate()
    {
        if (TPPPlanFaenamiento.ItemSelected != null && this.ViewState_TemplateCode == (TPPPlanFaenamiento.ItemSelected as PlanDeFaenamientoEnvasado).IdPlanFaenamientoEnvasado)
            return;

        if (TPPPlanFaenamiento.ItemSelected == null)
            return;

        if (TPCFechaInicio.Text.Trim() == string.Empty || txtHoraDesde.Text.Trim() == string.Empty)
        {
            _lblError.Text = "Si desea utilizar un template debe seleccionar primero la fecha de inicio, para que el sistema calcule las siguientes asignaciones.";
            TPPPlanFaenamiento.ItemSelected = null;
            return;
        }
        DateTime datFechaDesde;
        try
        {
            datFechaDesde = Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaInicio.Text), txtHoraDesde.Text);
        }
        catch
        {
            _lblError.Text = "La fecha de inicio no posee el formato correcto.";
            return;
        }
        PlanDeFaenamientoEnvasado objPlan = TPPPlanFaenamiento.ItemSelected as PlanDeFaenamientoEnvasado;
        Asignacion objAsignacion = null;
        DetallePlanFaenamientoEnvasado objDetalle = null;
        try
        {
            int i = 1;
            foreach (ItemDetallePlanFaenamientoEnvasado objItem in objPlan.DetallePlanFaenamientoEnvasado.ItemList)
            {
                objAsignacion = new Asignacion();
                objAsignacion.IdAsignacion = i;
                objAsignacion.Tarea = objItem.Asignacion.Tarea;
                objAsignacion.FechaDesde = datFechaDesde;
                objAsignacion.SetFechaFin();
                datFechaDesde = objAsignacion.FechaHasta;
                if (objDetalle == null)
                    objDetalle = new DetallePlanFaenamientoEnvasado();
                objDetalle.ItemList.Add(new ItemDetallePlanFaenamientoEnvasado(objAsignacion));
                objAsignacion = null;
                i++;
            }
            this.DetallePlan = objDetalle;
            this.ViewState_TemplateCode = objPlan.IdPlanFaenamientoEnvasado;
        }
        catch (BussinessLogicTecnoPezException ex)
        {
            TPPPlanFaenamiento.ItemSelected = null;
            _lblError.Text = ex.Message;
        }
        catch (Exception ex)
        {
            TPPPlanFaenamiento.ItemSelected = null;
            _lblError.Text = "Error inesperado. Ocurrió: " + ex.Message;
        }
    }
    private void InicializarGrillaDetalle()
    {
        DataControlField[] controlesExtra = new DataControlField[2];
        ButtonField b = new ButtonField();
        b.CommandName = "EditRow";
        b.HeaderText = "Editar";
        b.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/lupa.png";
        b.ButtonType = ButtonType.Image;

        controlesExtra[0] = b;

        b = new ButtonField();
        b.CommandName = "DeleteRow";
        b.HeaderText = "Eliminar";
        b.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/eliminar.gif";
        b.ButtonType = ButtonType.Image;

        controlesExtra[1] = b;

        grdAsignaciones.setupGrid(typeof(ItemDetallePlanFaenamientoEnvasado), CargarGrillaAsignaciones, true, false, this.ViewState, controlesExtra);
    }
    private void CargarGrillaAsignaciones()
    {
        if (this.DetallePlan != null && this.DetallePlan.ItemList.Count > 0)
        {
            this.DetallePlan.ItemList.Sort();
            grdAsignaciones.DataSource = this.DetallePlan.ItemList;

            DateTime datFechaDesde = DateTime.MaxValue;
            DateTime datFechaHasta = DateTime.MinValue;
            foreach (ItemDetallePlanFaenamientoEnvasado objItem in this.DetallePlan.ItemList)
            {
                if (objItem.Asignacion.FechaDesde != null && objItem.Asignacion.FechaDesde < datFechaDesde)
                    datFechaDesde = objItem.Asignacion.FechaDesde;
                if (objItem.Asignacion.FechaHasta != null && objItem.Asignacion.FechaHasta > datFechaHasta)
                    datFechaHasta = objItem.Asignacion.FechaHasta;

                if (datFechaDesde != DateTime.MaxValue)
                {
                    TPCFechaInicio.Text = datFechaDesde.ToShortDateString();
                    txtHoraDesde.Text = datFechaDesde.ToShortTimeString();
                    lblFechaHasta.Text = datFechaHasta.ToShortDateString();
                    lblHoraFin.Text = datFechaHasta.ToShortTimeString();
                }
                else
                {
                    TPCFechaInicio.Text = "";
                    txtHoraDesde.Text = "";
                    lblFechaHasta.Text = "";
                    lblHoraFin.Text = "";
                }
            }
        }
        else
            grdAsignaciones.DataSource = null;
        
        grdAsignaciones.DataBind();
        grdAsignaciones.Columns[6].Visible = false;
        grdAsignaciones.Columns[7].Visible = false;
        grdAsignaciones.Columns[8].Visible = false;
    }
    private void InicializarGrillaProductos()
    {
        DataControlField[] controlesExtra = new DataControlField[2];
        ButtonField b = new ButtonField();
        b.CommandName = "EditRow";
        b.HeaderText = "Editar";
        b.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/lupa.png";
        b.ButtonType = ButtonType.Image;

        controlesExtra[0] = b;

        b = new ButtonField();
        b.CommandName = "DeleteRow";
        b.HeaderText = "Eliminar";
        b.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/eliminar.gif";
        b.ButtonType = ButtonType.Image;

        controlesExtra[1] = b;

        grdProductos.setupGrid(typeof(ProductoEsperado), CargarGrillaProductos, true, false, this.ViewState, controlesExtra);
    }
    private void CargarGrillaProductos()
    {
        grdProductos.DataSource = this.ProductosPlan;
        grdProductos.DataBind();
    }
    private ProductosPlanFaenamientoEnvasado GetProductosFaenamiento()
    {
        ProductosPlanFaenamientoEnvasado objProductos = null;
        ProductosFaenamiento objProd = null;
        if (this.ProductosPlan != null && this.ProductosPlan.Count > 0)
        {
            objProductos = new ProductosPlanFaenamientoEnvasado();
            foreach (ProductoEsperado objItem in this.ProductosPlan)
            {
                objProd = new ProductosFaenamiento();
                objProd.Producto = objItem.Producto;
                objProd.CantidadEsperada = objItem.CantidadEsperada;

                objProductos.add(objProd);
            }            
        }
        return objProductos;
    }
    protected void grdAsignaciones_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow && this.DetallePlan != null && this.DetallePlan.ItemList.Count > 0)
        {
            //editar
            ImageButton objImage = e.Row.Controls[9].Controls[0] as ImageButton;
            if (objImage != null)
            {
                ItemDetallePlanFaenamientoEnvasado objItem = this.DetallePlan.ItemList[e.Row.RowIndex] as ItemDetallePlanFaenamientoEnvasado;
                if (objItem != null)
                {
                    objImage.OnClientClick = "window.open('Asignacion.aspx?id=" + objItem.Asignacion.IdAsignacion.ToString() + "','Asignacion','left=250,top=100,width=600,height=375,status=no,resizable=yes,scrollbars=no'); return false;";
                }
            }
            //eliminar
            objImage = e.Row.Controls[10].Controls[0] as ImageButton;
            if (objImage != null)
            {
                StringBuilder strScript = new StringBuilder();
                strScript.Append("if (!confirm('Desea aliminar la asignación del Plan de Faenamiento y Envasado?'))");
                strScript.Append("{return false;}");
                strScript.Append("else");
                strScript.Append("{");
                ItemDetallePlanFaenamientoEnvasado objItem=this.DetallePlan.ItemList[e.Row.RowIndex] as ItemDetallePlanFaenamientoEnvasado;
                if (objItem.Empleado == null)
                    strScript.Append("  if (confirm('Desea recalcular las fechas para las posteriores asignaciones que no poseen empleado?'))");
                else
                    strScript.Append("  if (confirm('Desea recalcular las fechas para las posteriores asignaciones del empleado?'))");
                strScript.Append("  {document.getElementById('" + hdnDelete.ClientID + "').value=1;}");
                strScript.Append("  else");
                strScript.Append("  { document.getElementById('" + hdnDelete.ClientID + "').value=0;}}");
                objImage.OnClientClick = strScript.ToString();
            }
        }
    }
    protected void grdAsignaciones_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (this.DetallePlan == null || this.DetallePlan.ItemList.Count == 0)
            return;

        if (e.CommandName == "DeleteRow")
        {
            if (this.hdnDelete.Value == "1")
            {
                //elimina la asignacion y recalcula las fechas
                ArrayList objItemsDetalle = this.DetallePlan.ItemList.Clone() as ArrayList;
                ItemDetallePlanFaenamientoEnvasado objItem = objItemsDetalle[Convert.ToInt32(e.CommandArgument)] as ItemDetallePlanFaenamientoEnvasado;
                if (Convert.ToInt32(e.CommandArgument) < objItemsDetalle.Count - 1)
                {
                    DateTime datFechaDesde = objItem.FechaDesde;
                    DateTime datFechaLibre = DateTime.Today;
                    ItemDetallePlanFaenamientoEnvasado objNextItem = null;
                    for (int i = Convert.ToInt32(e.CommandArgument) + 1; i < objItemsDetalle.Count; i++)
                    {
                        objNextItem = objItemsDetalle[i] as ItemDetallePlanFaenamientoEnvasado;                        
                        if (objItem.Empleado != null && objNextItem.Asignacion.Empleado != null && objItem.Empleado.IdEmpleado == objNextItem.Empleado.IdEmpleado)
                        {
                            objNextItem.Asignacion.FechaDesde = datFechaDesde;
                            objNextItem.Asignacion.SetFechaFin();
                            if (this.ViewState_IsUpdate)
                            {
                                if (!objItem.Asignacion.VerificarFechasUpdate(out datFechaLibre))
                                {
                                    _lblError.Text = "Error al reasignar las nuevas fechas. ";
                                    return;
                                }
                            }
                            else
                            {
                                if (!objItem.Asignacion.VerificarFechas(out datFechaLibre))
                                {
                                    _lblError.Text = "Error al reasignar las nuevas fechas. ";
                                    return;
                                }
                            }
                            datFechaDesde = objNextItem.Asignacion.FechaHasta;
                        }
                        else if (objItem.Empleado == null && objNextItem.Empleado == null)
                        {
                            objNextItem.Asignacion.FechaDesde = datFechaDesde;
                            objNextItem.Asignacion.SetFechaFin();
                            datFechaDesde = objNextItem.Asignacion.FechaHasta;
                        }                        
                    }
                }
                objItemsDetalle.RemoveAt(Convert.ToInt32(e.CommandArgument));
                this.DetallePlan.ItemList = objItemsDetalle;
            }
            else
            {
                this.DetallePlan.ItemList.RemoveAt(Convert.ToInt32(e.CommandArgument));
            }
            InicializarGrillaDetalle();
        }
    }
    protected void cmdNuevo_Click(object sender, EventArgs e)
    {
        this.VIEW_STATE_TEMPLATE = false;
        this.ViewState_TemplateCode = 0;
        SetMode(PageMode.NewMode);
        txtCodigo.Text = "";
        //TPPEstanque.ItemSelected = null;
        txtEstanque.Text = "";
        TPCFechaInicio.Text = "";
        txtHoraDesde.Text = "";
        lblFechaHasta.Text = "";
        lblHoraFin.Text = "";
        txtObservaciones.Text = "";
        TPPPlanFaenamiento.ItemSelected = null;
        this.DetallePlan = null;
        InicializarGrillaDetalle();
        this.ProductosPlan = null;
        InicializarGrillaProductos();
    }
    protected void cmdEditar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.EditMode);
    }
    protected void cmdEliminar_Click(object sender, EventArgs e)
    {
        try
        {
            PlanDeFaenamientoEnvasado objPlan = PlanDeFaenamientoEnvasado.getManager.GetOneByPrimaryKey(txtCodigo.Text);

            //using (TransactionScope objScope = new TransactionScope())
            //{
                if (PlanDeFaenamientoEnvasado.getManager.Delete(objPlan) == 0)
                    throw PlanDeFaenamientoEnvasado.getManager.GeneratedException;

                foreach (ItemDetallePlanFaenamientoEnvasado objItem in objPlan.DetallePlanFaenamientoEnvasado)
                {
                    if (Asignacion.getManager.Delete(objItem.Asignacion) == 0)
                        throw Asignacion.getManager.GeneratedException;
                }
                //objScope.Complete();
            //}
            SetMode(PageMode.ListMode);
            InicializarGrilla();
        }
        catch (Exception ex)
        {
            _lblError.Text = ex.Message;
        }
    }
    protected void cmdAceptar_Click(object sender, EventArgs e)
    {
        try
        {
            PlanDeFaenamientoEnvasado objPlan = new PlanDeFaenamientoEnvasado();
            
            objPlan.DetallePlanFaenamientoEnvasado = this.DetallePlan;
            objPlan.ProductosPlanFaenamientoEnvasado = this.GetProductosFaenamiento();

            if (objPlan.DetallePlanFaenamientoEnvasado == null)
            {
                _lblError.Text = "El plan debe incluir al menos una tarea a realizar.";
                return;
            }

            if (objPlan.ProductosPlanFaenamientoEnvasado == null || objPlan.ProductosPlanFaenamientoEnvasado.ItemList.Count == 0)
            {
                _lblError.Text = "El plan debe contener los productos esperados.";
                return;
            }

            if (!VerificarDetalles(objPlan))
                return;

            objPlan.IsTemplate = false;
            objPlan.Observaciones = txtObservaciones.Text;
            objPlan.Estanque = this.EstanqueSeleccionado;
            objPlan.FechaInicio = Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaInicio.Text), txtHoraDesde.Text);
            objPlan.FechaFin = Asignacion.ConcatenarFechaHora(Convert.ToDateTime(lblFechaHasta.Text), lblHoraFin.Text);
            objPlan.Estado = Convert.ToInt32(PlanDeFaenamientoEnvasado.EstadosPlan.Creado);

            if (getMode() == PageMode.NewMode)
            {
                using (TransactionScope objScope = new TransactionScope())
                {
                    foreach (ItemDetallePlanFaenamientoEnvasado objItem in objPlan.DetallePlanFaenamientoEnvasado.ItemList)
                    {
                        if (!Asignacion.getManager.Insert(objItem.Asignacion))
                            throw Asignacion.getManager.GeneratedException;
                    }
                    if (!PlanDeFaenamientoEnvasado.getManager.Insert(objPlan))
                    {
                        throw PlanDeFaenamientoEnvasado.getManager.GeneratedException;
                    }
                    objScope.Complete();
                }
                SetMode(PageMode.ListMode);
                InicializarGrilla();
                LimpiarSession();
                txtCodigo.Text = objPlan.IdPlanFaenamientoEnvasado.ToString();
                ImprimirPlan();
            }
            else
            {
                using (TransactionScope objScope = new TransactionScope())
                {
                    foreach (ItemDetallePlanFaenamientoEnvasado objItem in objPlan.DetallePlanFaenamientoEnvasado.ItemList)
                    {
                        if (!Asignacion.getManager.Update(objItem.Asignacion))
                            throw Asignacion.getManager.GeneratedException;
                    }
                    objPlan.IdPlanFaenamientoEnvasado = Convert.ToInt32(txtCodigo.Text);
                    if (!PlanDeFaenamientoEnvasado.getManager.Update(objPlan))
                    {
                        throw PlanDeFaenamientoEnvasado.getManager.GeneratedException;
                    }
                    objScope.Complete();
                }
                SetMode(PageMode.ViewMode);
            }
        }
        catch (Exception ex)
        {
            _lblError.Text = ex.Message;
        }
    }
    private bool VerificarDetalles(PlanDeFaenamientoEnvasado objPlan)
    {
        foreach (ItemDetallePlanFaenamientoEnvasado objItem in objPlan.DetallePlanFaenamientoEnvasado.ItemList)
        {
            if (objItem.Empleado == null)
            {
                _lblError.Text = "Datos incorrectos en las asignaciones del plan. Verifique los datos y vuelva a intentarlo.";
                return false;
            }
        }
        foreach (ProductosFaenamiento objProducto in objPlan.ProductosPlanFaenamientoEnvasado.ItemList)
        {
            if (objProducto.Producto == null || objProducto.CantidadEsperada == Convert.ToDecimal(0))
            {
                _lblError.Text = "Datos incorrectos en los productos esperados. Verifique los datos y vuelva a intentarlo.";
                return false;
            }
        }
        return true;
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.ListMode);
    }
    protected void grdProductos_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (grdProductos.Rows[0].Cells[0].Text == "&nbsp;")
        {
            return;
        }
        if (e.CommandName == "DeleteRow")
        {
            List<ProductoEsperado> objList = this.ProductosPlan;
            objList.RemoveAt(Convert.ToInt32(e.CommandArgument));
            this.ProductosPlan = objList;
            InicializarGrillaProductos();
        }
    }
    protected void grdProductos_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow && this.ProductosPlan != null && this.ProductosPlan.Count > 0)
        {
            //eliminar
            ImageButton objImage = e.Row.Controls[4].Controls[0] as ImageButton;
            if (objImage != null)
            {
                string strScript = "if (!confirm('Desea eliminar el producto seleccionado?')){return false;}";
                objImage.OnClientClick = strScript;
            }
            //editar
            objImage = e.Row.Controls[3].Controls[0] as ImageButton;
            if (objImage != null)
            {
                ProductoEsperado objProd = this.ProductosPlan[e.Row.RowIndex] as ProductoEsperado;
                string strScript = "window.open('ProductoEsperado.aspx?id=" + objProd.Producto.IdProducto.ToString() + "','Producto Esperado','left=250,top=100,width=600,height=375,status=no,resizable=yes,scrollbars=no'); return false;";
                objImage.OnClientClick = strScript;
            }
        }
    }
    protected void cmdImprimir_Click(object sender, EventArgs e)
    {
        ImprimirPlan();
    }
    private void ImprimirPlan()
    {
        int idPlan = Convert.ToInt32(txtCodigo.Text);

        visorDeReportes vr = new visorDeReportes();

        vr.archivoReporte = new PlanFaenamientoEnvasado();
        vr.paradescript = "";
        vr.paravalor = "";
        vr.selectionFormula = "{PLANESFAENAMIENTO.IDPLANFAENAMIENTO}=" + idPlan;
        vr.verReporte(Page);
    }
    #endregion

    #region Template
    protected void cmdTemplate_Click(object sender, EventArgs e)
    {
        this.VIEW_STATE_TEMPLATE = true;
        SetMode(PageMode.NewMode);
        txtCodigoTemplate.Text = "";
        txtObservacionesTemplate.Text = "";
        this.AsignacionesTemplate = null;
        _lblErrorTemplate.Text = "";
        this.AsignacionesTemplate = null;
        InicializarGrillaAsignacionesTemplate();
    }
    protected void cmdCancelarTemplate_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.ListMode);
    }
    private void InicializarGrillaAsignacionesTemplate()
    {
        DataControlField[] controlesExtra = new DataControlField[1];
        ButtonField b = new ButtonField();
        b.CommandName = "DeleteRow";
        b.HeaderText = "Eliminar";
        b.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/eliminar.gif";
        b.ButtonType = ButtonType.Image;

        controlesExtra[0] = b;

        grdAsigancionesTemplate.setupGrid(typeof(AsignacionTemplate), CargarGrillaAsignacionesTemplate, true, false, this.ViewState, controlesExtra);
    }
    private void CargarGrillaAsignacionesTemplate()
    {
        grdAsigancionesTemplate.DataSource = this.AsignacionesTemplate;
        grdAsigancionesTemplate.DataBind();
    }

    protected void cmdTareaTemplate_Click(object sender, EventArgs e)
    {
        List<AsignacionTemplate> objAsignaciones = this.AsignacionesTemplate;

        if (objAsignaciones == null)
            objAsignaciones = new List<AsignacionTemplate>();

        AsignacionTemplate objAsignacion = new AsignacionTemplate(TPPTareaTemplate.ItemSelected as Tarea);
        objAsignaciones.Add(objAsignacion);
        this.AsignacionesTemplate = objAsignaciones;

        InicializarGrillaAsignacionesTemplate();

        TPPTareaTemplate.ItemSelected = null;
    }
    private DetallePlanFaenamientoEnvasado GetDetalleFromTemplate()
    {
        if (this.AsignacionesTemplate == null)
        {
            return null;
        }
        if (this.AsignacionesTemplate.Count == 0)
        {
            return null;
        }

        ItemDetallePlanFaenamientoEnvasado objItemDetalle = null;
        Asignacion objAsignacion = null;
        DetallePlanFaenamientoEnvasado objDetalle=new DetallePlanFaenamientoEnvasado();
        foreach (AsignacionTemplate objItem in this.AsignacionesTemplate)
        {
            objAsignacion = new Asignacion();
            objAsignacion.Tarea = objItem.Tarea;
            objItemDetalle = new ItemDetallePlanFaenamientoEnvasado(objAsignacion);
            objDetalle.ItemList.Add(objItemDetalle);
        }
        return objDetalle;
    }
    protected void cmdAceptarTemplate_Click(object sender, EventArgs e)
    {
        try
        {
            PlanDeFaenamientoEnvasado objPlan = new PlanDeFaenamientoEnvasado();
            objPlan.IsTemplate = true;
            objPlan.Observaciones = txtObservacionesTemplate.Text;
            objPlan.DetallePlanFaenamientoEnvasado = this.GetDetalleFromTemplate();

            if (objPlan.DetallePlanFaenamientoEnvasado == null)
            {
                _lblErrorTemplate.Text = "El plan debe incluir al menos una tarea a realizar.";
                return;
            }

            if (getMode() == PageMode.NewMode)
            {
                //using (TransactionScope objScope = new TransactionScope())
                //{
                    foreach (ItemDetallePlanFaenamientoEnvasado objItem in objPlan.DetallePlanFaenamientoEnvasado.ItemList)
                    {
                        if (!Asignacion.getManager.Insert(objItem.Asignacion))
                            throw Asignacion.getManager.GeneratedException;
                    }
                    if (!PlanDeFaenamientoEnvasado.getManager.Insert(objPlan))
                    {
                        throw PlanDeFaenamientoEnvasado.getManager.GeneratedException;
                    }
                //    objScope.Complete();
                //}                
                SetMode(PageMode.ListMode);
                InicializarGrilla();
                LimpiarSession();
            }
            else
            {
                //using (TransactionScope objScope = new TransactionScope())
                //{                    
                    foreach (ItemDetallePlanFaenamientoEnvasado objItem in objPlan.DetallePlanFaenamientoEnvasado.ItemList)
                    {
                        if (!Asignacion.getManager.Insert(objItem.Asignacion))
                            throw Asignacion.getManager.GeneratedException;
                    }
                    objPlan.IdPlanFaenamientoEnvasado = Convert.ToInt32(txtCodigoTemplate.Text);
                    if (!PlanDeFaenamientoEnvasado.getManager.Update(objPlan))
                    {
                        throw PlanDeFaenamientoEnvasado.getManager.GeneratedException;
                    }
                //    objScope.Complete();
                //}
                SetMode(PageMode.ViewMode);
            }
        }
        catch (Exception ex)
        {
            _lblErrorTemplate.Text = ex.Message;
        }
    }
    protected void cmdEditarTemplate_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.EditMode);
    }
    protected void cmdEliminarTemplate_Click(object sender, EventArgs e)
    {
        try
        {
            PlanDeFaenamientoEnvasado objPlan = PlanDeFaenamientoEnvasado.getManager.GetOneByPrimaryKey(txtCodigoTemplate.Text);

            //using (TransactionScope objScope = new TransactionScope())
            //{
            if (PlanDeFaenamientoEnvasado.getManager.Delete(objPlan) == 0)
                throw PlanDeFaenamientoEnvasado.getManager.GeneratedException;

            foreach (ItemDetallePlanFaenamientoEnvasado objItem in objPlan.DetallePlanFaenamientoEnvasado)
            {
                if (Asignacion.getManager.Delete(objItem.Asignacion) == 0)
                    throw Asignacion.getManager.GeneratedException;
            }
            //objScope.Complete();
            //}
            SetMode(PageMode.ListMode);
            InicializarGrilla();
        }
        catch (Exception ex)
        {
            _lblError.Text = ex.Message;
        }
    }
    protected void grdAsigancionesTemplate_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (grdAsigancionesTemplate.Rows[0].Cells[0].Text == "&nbsp;")
        {
            return;
        }
        
        int intIndice = Convert.ToInt32(e.CommandArgument);
        List<AsignacionTemplate> objList = this.AsignacionesTemplate;
        if (e.CommandName == "DeleteRow")
        {
            if (objList != null)
            {
                objList.RemoveAt(intIndice);
                this.AsignacionesTemplate = objList;
            }
            InicializarGrillaAsignacionesTemplate();
        }
    }
    #endregion

    #region Miembros de IPostBackEventHandler

    public void RaisePostBackEvent(string eventArgument)
    {
        switch (eventArgument)
        {
            case "Asignacion":
                InicializarGrillaDetalle();
                break;
            case "LoadEstanque":
                //buscar los productos esperados
                List<ProductosFaenamiento> objList = PlanDeFaenamientoEnvasado.GetProductos(this.EstanqueSeleccionado.idEstanque);
                txtEstanque.Text = this.EstanqueSeleccionado.ToString();
                if (objList == null || objList.Count == 0)
                {
                    return;
                }
                Session["productosPlanFaenamiento"] = objList;
                InicializarGrillaProductos();                
                break;
            case "LoadProductoEsperado":
                InicializarGrillaProductos();
                break;
        }
    }

    #endregion

    #region Clases de soporte para las grillas
    /// <summary>
    /// Utilizada para el manejo de las asignaciones del template
    /// </summary>
    private class AsignacionTemplate
    {
        private Tarea objTarea;

        public AsignacionTemplate(ItemDetallePlanFaenamientoEnvasado objItem)
        {
            this.objTarea = objItem.Asignacion.Tarea;
        }

        public AsignacionTemplate(Tarea objTarea)
        {
            this.objTarea = objTarea;
        }

        [FriendlyName("Tarea",true)]
        public Tarea Tarea
        {
            get { return objTarea; }
            set { objTarea = value; }
        }
    }

    public class ProductoEsperado
    {
        private Producto objProducto;
        private decimal cantidadEsperada;

        public ProductoEsperado(ProductosFaenamiento objProductoFaenamiento)
        {
            this.Producto = objProductoFaenamiento.Producto;
            this.CantidadEsperada = objProductoFaenamiento.CantidadEsperada;
        }

        [FriendlyName("Producto", true)]
        public Producto Producto
        {
            get { return objProducto; }
            set { objProducto = value; }
        }

        [FriendlyName("Unidad Medida", true)]
        public UnidadMedida UnidadMedida
        {
            get { return objProducto.UnidadMedida; }
        }

        [FriendlyName("Cantidad Esperada", true)]
        public decimal CantidadEsperada
        {
            get { return cantidadEsperada; }
            set { cantidadEsperada = value; }
        }
    }
    #endregion    
}